/**
 * @file nmcom.c
 *
 *  Created on: Mar 22, 2010
 *  Author: Marco Luisi
 */

#include "nmcom.h"

// fare il controllo sulla receive fuori....
//spostare gli error check dalla libreria al programma?

/**
 *
 * @param ch
 * @param msg
 * @return
 */
int receive(int ch, message_t *msg) { // meglio passare il riferimento a message?

	int rd; //usarlo in qualche modo?
	int len;
	int i;
	//setup iniziale del messaggio
	printf("DEBUG NMCOM RECEIVE ch=%d\n",ch);
	EC_M1(rd= read(ch, &(msg->cmdcode), sizeof(int)));
	printf("DEBUG RECEIVE letti %d bytes\n",rd);
	printf("DEBUG receive letto code=%d\n",msg->cmdcode);
	EC_M1(read(ch, &(msg->argnum), sizeof(int)));
	printf("DEBUG RECEIVE letti %d bytes\n",rd);
	printf("DEBUG receive letto argnum=%d\n",msg->argnum);
	EC_M1(read(ch, &(msg->nnum), sizeof(int)));
	printf("DEBUG RECEIVE letti %d bytes\n",rd);
	printf("DEBUG receive letto nnum=%d\n",msg->nnum);

	//lettura eventuali argomenti
	if (msg->argnum) {
		printf("DEBUG receive letura args\n");
		EC_NULL(msg->args = (char**)malloc(msg->argnum * sizeof(char*)));
		//salvarsi i limiti per evitare ogni volta di fare 2 accessi?
		for(i = 0; i < msg->argnum; i++) {
			EC_M1(read(ch,&len,sizeof(int))); //leggo la lunghezza della stringa da leggere
			printf("DEBUG RECEIVE letti %d bytes\n",rd);
			printf("DEBUG receive letto len=%d\n",len);
			EC_NULL(msg->args[i] = malloc(len * sizeof(char))); //char o char*?
			EC_M1(rd = read(ch, msg->args[i], len)); // lettura stringa
			printf("DEBUG receive letto arg %d=!%s! %d bytes\n",i,msg->args[i],rd);

		}

	}
	//lettura eventuali numeri
	if (msg->nnum) {
		EC_NULL(msg->numbers = malloc(msg->nnum * sizeof(double)));
		for(i = 0; i < msg->nnum; i++){
			EC_M1(rd = read(ch, &(msg->numbers[i]), sizeof(double)));
			printf("DEBUG RECEIVE letti %d bytes\n",rd);

		}


	}

	return msg->cmdcode;//ok?

}


/**
 *
 * @param ch
 * @param msg
 * @return
 */
int send(int ch, message_t *msg) {

	int i;
	int len;
	int wr;
	printf("DEBUG NMCOM SEND\n");
	msgprint(msg);
	//invio dei parametri del messaggio
	EC_M1(wr = write(ch,&(msg->cmdcode),sizeof(int)));
	printf("DEBUG NMCOM wr = %d\n",wr);
	EC_M1(wr = write(ch,&(msg->argnum),sizeof(int)));
	printf("DEBUG NMCOM wr = %d\n",wr);
	EC_M1(wr = write(ch,&(msg->nnum),sizeof(int)));
	printf("DEBUG NMCOM wr = %d\n",wr);
	//invio degli argomenti del messaggio
	if(msg->argnum) {
		//printf("DEBUG NMCOM SEND\n");
		for(i = 0; i < msg->argnum; i++){
			len = strlen(msg->args[i]);
			printf("DBG send arg %d, len %d = !%s!",i,len,msg->args[i]);
			EC_M1(wr= write(ch,&len,sizeof(int))); //SGAMATO
			printf("DEBUG NMCOM wr = %d\n",wr);
			EC_M1(wr = write(ch,msg->args[i],len * sizeof(char)));

		}

		//invio dei numeri nel messaggio
		for(i = 0; i < msg->nnum; i ++) {
			EC_M1(wr= write(ch,&(msg->numbers[i]),sizeof(double)));
			printf("DEBUG NMCOM wr = %d\n",wr);
		}

	}
	printf("DEBUG fine NCOM SEND\n");
	return 1;
}

/**
 *
 * @param m
 */
void msgprint(message_t *m) {
	int i;
	printf("Debug MSGPRINT:\n");
	if (&m != NULL) {
		printf("cmdcode= %d || argnum= %d || nnum= %d\n", m->cmdcode, m->argnum,
				m->nnum);
		if (m->argnum) {
			for (i = 0; i < m->argnum; i++) {
				printf("arg[%d]=%s\n", i, m->args[i]);
			}
		}
		if (m->nnum) {
			for (i = 0; i < m->nnum; i++) {
				printf("num[%d]=%g\n", i, m->numbers[i]);
			}
		}

	}

}//fine msgprint

